package com.cwt_taxi_xa.protocol.card.cmd;
import android.text.TextUtils;

import com.cwt_taxi_xa.util.AppLog;
import com.cwt_taxi_xa.util.DateUtil;
import com.cwt_taxi_xa.util.Tools;

import java.io.UnsupportedEncodingException;
/**
 *
 * 出租汽车服务管理信息文件
 * @author undi
 *
 */
public class CardSMInfoEF04 extends BaseCmd<AckCallBack>{
	String TAG = "CardSMInfoEF04";
	//车牌号
	private String carn;
	//总包大小
	private int pcfileSize = 556;
	//当前数据包
	private int dataIndex = 0;

	public CardSMInfoEF04(String cmdTag, AckCallBack ackCallBack,String carn) {
		super(cmdTag, ackCallBack);
		this.carn = carn;
		AppLog.d(TAG, "CardSMInfoEF04 carn:" + carn);
		//由于默认发生第一包数据,所以调整
		dataIndex = 1;
		// TODO Auto-generated constructor stub
	}


	@Override
	public void decode(byte[] order) {
		// TODO Auto-generated method stub
		// 缓存数据
		saveCacheData(order);
		if(lastIndexIsNull(order)){
			//异常读卡解析结束
			AppLog.d(TAG,"符合非空判断,执行解析数据");
			dataInfo();
			//pcfileSize不足不处理
		}else{
			//读取下一包数据
			readOnePackage();
		}
	}

	@Override
	public String data() {
		// TODO Auto-generated method stub
		return "02 EF04 01 0000 " + Tools.parseByte2HexStr(Tools.int2Bytes2(dataLength, 2));//0104[260] /022C[556 ]
	}


	public String data(int start,int size) {
		// TODO Auto-generated method stub
		//
		return "02 EF04 01 "+ Tools.parseByte2HexStr(Tools.int2Bytes2(start, 2)) +" " +  Tools.parseByte2HexStr(Tools.int2Bytes2(size, 2));//0104[260] /022C[556 ]
	}


	private void readOnePackage(){
		AppLog.d(TAG,"readOnePackage fileDataIndex:" + dataIndex + " count:" + (pcfileSize/dataLength) + " dataLength:" + dataLength);
		if(dataIndex <pcfileSize/dataLength){
			ackCallBack.sendCmd(cmd(),data(dataIndex * dataLength,dataLength));//读取第一个包
			dataIndex ++ ;
		}else if(dataIndex <= (pcfileSize/dataLength)){
			ackCallBack.sendCmd(cmd(),data(dataIndex * dataLength,pcfileSize - (dataIndex * dataLength)));//读取最后一包
			dataIndex ++ ;
		}else{
			//正常读卡解析
			AppLog.e(TAG,"服务管理数据读卡结束");
			dataInfo();
		}
	}


	public void dataInfo(){
		// 非标准协议
		try {
			String str = new String(substringSecondLastNull(cacheData), "GBK");// order.length-114-6
			AppLog.d("----------------------------------------------------------" + Tools.parseByte2HexStr(substringSecondLastNull(cacheData)));
			String[] ss = str.split(",");
			AppLog.d("----------------------------------------------------------");
			AppLog.d("数量：" + ss.length +  " CardSMInfoEF04 carn:" + carn);
			AppLog.savelog(str + " CardSMInfoEF04 carn:" + carn);
			AppLog.d("----------------------------------------------------------");
			for (int i = 0; i < ss.length; i++) {
				AppLog.d(" " + (i + 1) + ": " + ss[i]);
			}
			AppLog.d("----------------------------------------------------------");

			if (ss != null && ss.length >= 15) {
				// 1 服务资格证状态 4 0：未激活；1：已激活
				// 2 发证日期 18 字符串，YYYYMMDD
				// 3 有效期 18 字符串，YYYYMMDD
				// 4 投诉电话 12 字符串 （12345）
				// 5 核发机关 18 最大存储20汉字（西安市出租管理处）
				// 6 驾驶员代码 16 16位数字
				// 7 准驾车辆范围 4 1 : 司机可开本公司范围内的车
				// 2 : 司机可以开全市所有的车
				// 3 : 司机可开个体户所拥有的几辆车
				// 4 : 司机只能开分配的具体一辆车
				// 其它：RFU
				// 可默认为：4；具体的允许车辆见“出租车驾驶员车辆准驾文件”中的准驾车牌列表。
				// 8 预留 110 预留字段(可扩展营运区域等相关)k
				// 服务星级 4 代表司机的星级
				// 1-代表无评级
				// 2-B
				// 3-A
				// 4-AA
				// 5-AAA
				// 其它-预留使用
				// 10 评定日期 18 字符串,YYYYMMDD
				// 11 年度得分 6 BCD编码 可描述0-99
				// 12 其他 28 预留使用，可用于信誉质量考核
				// 13 服务单位代码标识 10 字符串
				// 14 服务单位简称 18 最大存储20汉字，用于机读设备读取，便于稽查（建议简称）
				// 15 变更日期 18 字符串,YYYYMMDD
				// 16 准驾车牌列表 120 最多20组车，每个车牌信息为6字节字符；不足以空格填充
				// 17 下一次回单位培训时间 18 字符串,YYYYMMDD
				// 18 预留字段 236
				// 说明 四、待扩展使用信息（468字节）
				// 19 预留

				if ("0".equals(ss[0])) {
					AppLog.d(TAG, "证件未激活，无法签到签退");
					ackCallBack.error(cmdTag, 0, "证件未激活，无法签到签退");
				} else if (DateUtil.date_compare(ss[2], DateUtil.getTodayDateDf9()) == -1) {
					AppLog.d(TAG, "证件有效期已超期，请速与审批大厅联系");
					ackCallBack.error(cmdTag, 0, "证件有效期已超期，请速与审批大厅联系");
					return;
				//} else if (ss.length > 15 && !defaultNumber(carn) && !containsCarNumber(ss[15], carn)) {
				}else if(ss.length > 15 && !defaultNumber(carn) && !containsCarNumber( ss[15].split(";"),carn)){
					if(! containsCarNumber(ss[15], carn)){
						AppLog.d(TAG, "非准驾车辆，无法签到签退");
						ackCallBack.error(cmdTag, 0, "非准驾车辆，无法签到签退");
						return;
					}
				}
				if (ss != null && ss.length > 17) {
					AppLog.e(TAG, "预留数据未处理!***********************");
				}
				ackCallBack.callBack(cmdTag, ss);
				//
			} else {
				// 限制读卡长度
				ackCallBack.error(cmdTag, 1, "服务管理数据异常");
				AppLog.e(TAG, "服务管理数据异常!" + (ss == null ? "ss is null" : "ss.length:" + ss.length));
			}
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			AppLog.e(TAG, e.getMessage());
			AppLog.savelog(e.getMessage());
			if (ackCallBack != null) {
				ackCallBack.error(cmdTag, 1, "服务管理数据编码错误!***********************");
			}
		}
	}


	private boolean containsCarNumber(String[] numberArray,String number){
		boolean result = false;
		try {
			if (!TextUtils.isEmpty(number)) {
				if (numberArray != null && numberArray.length > 0) {
					for (int i = 0; i < numberArray.length; i++) {
						if (number.endsWith(numberArray[i])) {
							result = true;
							break;
						}

					}
				}
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return result;
	}
	@Deprecated
	private boolean containsCarNumber(String data,String number){
		boolean result = false;
		try {
			if(!TextUtils.isEmpty(number)){
				int size = data.length()/5;
				AppLog.d(TAG, "size:" + size);
				for(int i = 0 ; i < size; i++){
					if((i+1)*5 <= data.length()){
						String dataNumber = data.substring(i * 5 ,(i+1)*5);
						AppLog.d(TAG,   "dataNumber:" + dataNumber + " number.endsWith(dataNumber):" + number.equals(dataNumber));
						if(number.endsWith(dataNumber)){
							result = true;
							break;
						}
					}
				}
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return result;
	}

}
